home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / MacApp Release 10 / MacApp Release 10 - HD Ready / Libraries / Framework / Sources / UOSAScript.cp < prev    next >
Encoding:
Text File  |  1996-04-03  |  28.3 KB  |  900 lines  |  [TEXT/MPS ]

  1. //----------------------------------------------------------------------------------------
  2. // UOSAScript.cp
  3. // Copyright © 1988-96 by Apple Computer, Inc. All rights reserved.
  4. //----------------------------------------------------------------------------------------
  5.  
  6. #ifndef __UOSASCRIPT__
  7. #include "UOSAScript.h"
  8. #endif
  9.  
  10. // MacApp
  11.  
  12. #ifndef __UCOMMANDHANDLER__
  13. #include "UCommandHandler.h"
  14. #endif
  15.  
  16. #ifndef __UCOREGLOBALS__
  17. #include "UCoreGlobals.h"
  18. #endif
  19.  
  20. #ifndef __UCOREUTILITIES__
  21. #include "UCoreUtilities.h"
  22. #endif
  23.  
  24. #ifndef __UDISPATCHER__
  25. #include "UDispatcher.h"
  26. #endif
  27.  
  28. #ifndef __UFAILURE__
  29. #include "UFailure.h"
  30. #endif
  31.  
  32. #ifndef __UFILE__
  33. #include "UFile.h"
  34. #endif
  35.  
  36. #ifndef __UMACAPPGLOBALS__
  37. #include "UMacAppGlobals.h"
  38. #endif
  39.  
  40. //    #ifndef __UMACAPPUTILITIES__
  41. //    #include "UMacAppUtilities.h"
  42. //    #endif
  43.  
  44. #ifndef __USCRIPTING__
  45. #include "UScripting.h"
  46. #endif
  47.  
  48. // Toolbox
  49.  
  50. #ifndef __AEPACKOBJECT__
  51. #include <AEPackObject.h>
  52. #endif
  53.  
  54. #ifndef __ASDEBUGGING__
  55. #include <ASDebugging.h>
  56. #endif
  57.  
  58. #ifndef __ASREGISTRY__
  59. #include <ASRegistry.h>
  60. #endif
  61.  
  62. #ifndef __OSAGeneric__
  63. #include <OSAGeneric.h>
  64. #endif
  65.  
  66. #ifndef __RESOURCES__
  67. #include <Resources.h>
  68. #endif
  69.  
  70. //----------------------------------------------------------------------------------------
  71. // Static Allocations
  72. //----------------------------------------------------------------------------------------
  73.  
  74. ComponentInstance COSAScript::fgGenericScriptingComponent;
  75.  
  76. COSAScript COSAScript::fgGlobalScript;
  77. COSAScript COSAScript::fgSharedScript;
  78. COSAScript COSAScript::fgEmptyScript;
  79.  
  80. //========================================================================================
  81. // CLASS COSAScript
  82. //========================================================================================
  83.  
  84. //----------------------------------------------------------------------------------------
  85. // COSAScript::GetDefaultComponent: 
  86. //----------------------------------------------------------------------------------------
  87. #pragma segment MAApplicationRes
  88.  
  89. ComponentInstance COSAScript::GetDefaultComponent()
  90. {
  91.     if (HasAppleScript() && !fgGenericScriptingComponent)
  92.         fgGenericScriptingComponent = OpenDefaultComponent(kOSAComponentType,
  93.                                                            kOSAGenericScriptingComponentSubtype);
  94.  
  95.     return fgGenericScriptingComponent;
  96. }
  97.  
  98. //----------------------------------------------------------------------------------------
  99. // COSAScript::GetEmptyScript: 
  100. //----------------------------------------------------------------------------------------
  101. #pragma segment MAApplicationRes
  102.  
  103. COSAScript COSAScript::GetEmptyScript()
  104. {
  105.     if (HasAppleScript() && (fgEmptyScript == kOSANullScript))
  106.     {
  107.         ComponentInstance defaultComponent = GetDefaultComponent();
  108.         Handle scriptRes = MAGet1Resource('scpt', 128);
  109.         FailNILResource(scriptRes);
  110.         DetachResource(scriptRes);
  111.         CTempDesc emptyScriptDesc('scpt', scriptRes);
  112.         fgEmptyScript.SetScript(defaultComponent, emptyScriptDesc,
  113.                                 kOSAModeCompileIntoContext, kOSAModeNull);
  114.     }
  115.     return fgEmptyScript;
  116. }
  117.  
  118. //----------------------------------------------------------------------------------------
  119. // COSAScript::COSAScript
  120. //----------------------------------------------------------------------------------------
  121. #pragma segment ConstructorRes
  122.  
  123. COSAScript::COSAScript()
  124. {
  125.     fScriptID = kOSANullScript;
  126. }
  127.  
  128. //----------------------------------------------------------------------------------------
  129. // COSAScript::COSAScript
  130. //----------------------------------------------------------------------------------------
  131. #pragma segment ConstructorRes
  132.  
  133. COSAScript::COSAScript(OSAID theScript)
  134. {
  135.     fScriptID = theScript;
  136. }
  137.  
  138. //----------------------------------------------------------------------------------------
  139. // COSAScript::IsEmpty
  140. //----------------------------------------------------------------------------------------
  141. #pragma segment MAScriptingRes
  142.  
  143. Boolean COSAScript::IsEmpty()
  144. {
  145.     return (fScriptID == kOSANullScript);
  146. }
  147.  
  148. //----------------------------------------------------------------------------------------
  149. // COSAScript::DisposeScript
  150. //----------------------------------------------------------------------------------------
  151. #pragma segment MAScriptingRes
  152.  
  153. OSAError COSAScript::DisposeScript(ComponentInstance theComponent)
  154. {
  155.     OSAError err = noErr;
  156.     if (!IsEmpty())
  157.     {
  158.         short saveRefNum = MACurResFile(); // preserve the current resource file
  159.         err = OSADispose(theComponent, fScriptID);
  160.         fScriptID = kOSANullScript;
  161.         MAUseResFile(saveRefNum);
  162.     }
  163.     return err;
  164. }
  165.  
  166. //----------------------------------------------------------------------------------------
  167. // COSAScript::Execute
  168. //----------------------------------------------------------------------------------------
  169. #pragma segment MAScriptingRes
  170.  
  171. OSAError COSAScript::Execute(ComponentInstance theComponent,
  172.                           OSAID theContext,
  173.                           long executeFlags,
  174.                           OSAID& theResult)
  175. {
  176.     OSAError err = noErr;
  177.     short saveRefNum = MACurResFile(); // preserve the current resource file
  178.     err = OSAExecute(theComponent, fScriptID, theContext, executeFlags, &theResult);
  179.     MAUseResFile(saveRefNum);
  180.     return err;
  181. }
  182.  
  183. //----------------------------------------------------------------------------------------
  184. // COSAScript::GetScript
  185. //----------------------------------------------------------------------------------------
  186. #pragma segment MAScriptingRes
  187.  
  188. OSAError COSAScript::GetScript(ComponentInstance theComponent,
  189.                             DescType whichType,
  190.                             CAEDesc& scriptDesc,
  191.                             long storeFlags)
  192. {
  193.     short saveRefNum = MACurResFile(); // getting the script may toss the resource chain
  194.     OSAError err = noErr;
  195.     
  196.     // Check to see if they want a text version of the script
  197.     if ((whichType == typeIntlText) || (whichType == typeChar))
  198.         err = OSAGetSource(theComponent, fScriptID, whichType, scriptDesc);
  199.     else
  200.         err = OSAStore(theComponent, fScriptID, whichType, storeFlags, scriptDesc);
  201.     
  202.     MAUseResFile(saveRefNum);
  203.     return err;
  204. }
  205.  
  206. //----------------------------------------------------------------------------------------
  207. // COSAScript::SetScript
  208. //----------------------------------------------------------------------------------------
  209. #pragma segment MAScriptingRes
  210.  
  211. OSAError COSAScript::SetScript(ComponentInstance theComponent,
  212.                                const CAEDesc& scriptDesc,
  213.                                long compileFlags,
  214.                                long loadFlags)
  215. {
  216.     short saveRefNum = MACurResFile(); // setting the script may toss the resource chain
  217.     OSAError err = noErr;
  218.     FailInfo fi;
  219.     Try(fi)
  220.     {
  221.         OSAID newScriptID = kOSANullScript;
  222.         DescType scriptType = scriptDesc.GetDescriptorType();
  223.         if (scriptType != typeNull)
  224.         {
  225.             if ((scriptType == typeIntlText) || (scriptType == typeChar))
  226.             {
  227.                 if (scriptDesc.GetDataSize() != 0) // lets you empty out an objects script with ""
  228.                     FailOSAError(OSACompile(theComponent, scriptDesc, compileFlags, &newScriptID));
  229.             }
  230.             else if ((scriptType == typeFSS) || (scriptType == typeAlias))
  231.             {
  232.                 TFile* scriptFile = NewFile('\?\?\?\?', '\?\?\?\?', kUsesDataFork, preferResourceFork, !kDataOpen, !kRsrcOpen);
  233.                 if (scriptType == typeAlias)
  234.                     scriptFile->SpecifyWithAlias((AliasHandle)scriptDesc.GetDataHandle());
  235.                 if (scriptType == typeFSS)
  236.                 {
  237.                     FSSpec theSpec = **(FSSpec**)scriptDesc.GetDataHandle();
  238.                     scriptFile->Specify(theSpec);
  239.                 }
  240.                 OSType fileType = '\?\?\?\?';
  241.                 FailOSErr(scriptFile->GetFileType(fileType));
  242.                 if (fileType == 'TEXT')
  243.                 {
  244.                     scriptFile->fUsesRsrcFork = noResourceFork;
  245.                     FailOSErr(scriptFile->OpenFile());
  246.                     long textSize = 0;
  247.                     FailOSErr(scriptFile->GetDataLength(textSize));
  248.                     Handle textHdl = NewHandle(textSize);
  249.                     FailNIL(textHdl);
  250.                     SignedByte wasState = LockHandle(textHdl);
  251.                     FailOSErr(scriptFile->ReadData(*textHdl, textSize));
  252.                     HSetState(textHdl, wasState);
  253.                     FailOSErr(scriptFile->CloseFile());
  254.                     CTempDesc textDesc(typeChar, textHdl);
  255.                     FailOSAError(OSACompile(theComponent, textDesc, compileFlags, &newScriptID));
  256.                 }
  257.                 else if (fileType == kOSAFileType)
  258.                 {
  259.                     scriptFile->fUsesDataFork = FALSE;
  260.                     scriptFile->fUsesRsrcFork = needResourceFork;
  261.                     FailOSErr(scriptFile->OpenFile());
  262.                     Handle scriptHdl = Get1Resource(kOSAScriptResourceType, 128);
  263.                     FailNILResource(scriptHdl);
  264.                     CAEDesc scriptRsrcDesc(typeOSAGenericStorage, scriptHdl);
  265.                     FailOSAError(OSALoad(theComponent, scriptRsrcDesc, loadFlags, &newScriptID));
  266.                     FailOSErr(scriptFile->CloseFile());
  267.                 }
  268.                 scriptFile = (TFile*)FreeIfObject(scriptFile);
  269.             }
  270.             else
  271.                 FailOSAError(OSALoad(theComponent, scriptDesc, loadFlags, &newScriptID));
  272.         }
  273.         if (!IsEmpty())
  274.             FailOSErr(DisposeScript(theComponent));
  275.         fScriptID = newScriptID;
  276.         fi.Success();
  277.     }
  278.     else // Recover
  279.     {
  280.         err = fi.error;
  281.     }
  282.  
  283.     MAUseResFile(saveRefNum);
  284.     return err;
  285. }
  286.  
  287. //----------------------------------------------------------------------------------------
  288. // COSAScript::SetParentScript
  289. //----------------------------------------------------------------------------------------
  290. #pragma segment MAScriptingRes
  291.  
  292. OSAError COSAScript::SetParentScript(ComponentInstance genericComponent,
  293.                                      OSAID itsParent)
  294. {
  295.     OSAError err = noErr;
  296.     short saveRefNum = MACurResFile(); // preserve the current resource file
  297.     FailInfo fi;
  298.     Try(fi)
  299.     {
  300.         if (!IsEmpty()) 
  301.         {
  302.             ComponentInstance exactComponent = NULL;
  303.             CTempDesc parentProp;
  304.             DescType parentCode = pASParent;
  305.             FailOSErr(AECreateDesc(typeProperty, (Ptr)&parentCode, sizeof(parentCode), parentProp));
  306.             OSAID myScriptID = fScriptID;
  307.             OSAID parentScriptID = itsParent;
  308.             if (itsParent == kOSANullScript)
  309.                 parentScriptID = GetEmptyScript();
  310.             FailOSAError(OSAGenericToRealID(genericComponent, &myScriptID, &exactComponent));
  311.             FailOSAError(OSAGenericToRealID(genericComponent, &parentScriptID, &exactComponent));
  312.             FailOSAError(OSASetProperty(exactComponent, kOSAModeNull, myScriptID, parentProp, parentScriptID));
  313.         }
  314.         fi.Success();
  315.     }
  316.     else // Recover
  317.     {
  318.         err = fi.error;
  319.     }
  320.     MAUseResFile(saveRefNum);
  321.     return err;
  322. }
  323.  
  324. //----------------------------------------------------------------------------------------
  325. // COSAScript::GetParentScript
  326. //----------------------------------------------------------------------------------------
  327. #pragma segment MAScriptingRes
  328.  
  329. OSAError COSAScript::GetParentScript(ComponentInstance genericComponent,
  330.                                      OSAID& itsParent)
  331. {
  332.     OSAError err = noErr;
  333.     short saveRefNum = MACurResFile(); // preserve the current resource file
  334.     FailInfo fi;
  335.     Try(fi)
  336.     {
  337.         if (!IsEmpty())
  338.         {
  339.             CTempDesc parentProp;
  340.             ComponentInstance exactComponent = NULL;
  341.             DescType parentCode = pASParent;
  342.             FailOSErr(AECreateDesc(typeProperty, (Ptr)&parentCode, sizeof(parentCode), parentProp));
  343.             OSAID myScriptID = fScriptID;
  344.             OSAID parentScriptID = fScriptID;
  345.             
  346.             if (genericComponent != exactComponent)
  347.             {
  348.                 FailOSAError(OSAGenericToRealID(genericComponent, &myScriptID, &exactComponent));
  349.             }
  350.             FailOSAError(OSAGetProperty(exactComponent, kOSAModeNull, myScriptID, parentProp, &parentScriptID));
  351.             if ((err == noErr) && (genericComponent != exactComponent))
  352.             {
  353.                 FailOSAError(OSARealToGenericID(genericComponent, &parentScriptID, exactComponent));
  354.             }
  355.             itsParent = parentScriptID;
  356.         }
  357.         fi.Success();
  358.     }
  359.     else // Recover
  360.     {
  361.         err = fi.error;
  362.     }
  363.  
  364.     MAUseResFile(saveRefNum);
  365.     return err;
  366. }
  367.  
  368. //----------------------------------------------------------------------------------------
  369. // COSAScript::DoOSAEvent
  370. //----------------------------------------------------------------------------------------
  371. #pragma segment MAScriptingRes
  372.  
  373. OSAError COSAScript::DoOSAEvent(ComponentInstance theComponent,
  374.                                 TAppleEvent* message,
  375.                                 TAppleEvent* reply,
  376.                                 long modeFlags)
  377. {
  378.     OSAError err = noErr;
  379.     short saveRefNum = MACurResFile(); // preserve the current resource file
  380.     err = OSADoEvent(theComponent, &message->fMessage, fScriptID, modeFlags, &reply->fMessage);
  381.     MAUseResFile(saveRefNum);
  382.     return err;
  383. }
  384.  
  385. //========================================================================================
  386. // CLASS COSAScriptCntPtr
  387. //========================================================================================
  388.  
  389. //----------------------------------------------------------------------------------------
  390. // COSAScriptCntPtr::COSAScriptCntPtr
  391. //----------------------------------------------------------------------------------------
  392.  
  393. COSAScriptCntPtr::COSAScriptCntPtr() :
  394.     fRep(NULL)
  395. {
  396. }
  397.  
  398. //----------------------------------------------------------------------------------------
  399. // COSAScriptCntPtr::~COSAScriptCntPtr
  400. //----------------------------------------------------------------------------------------
  401.  
  402. COSAScriptCntPtr::~COSAScriptCntPtr()
  403. {
  404.     DownCount();
  405. }
  406.  
  407. //----------------------------------------------------------------------------------------
  408. // COSAScriptCntPtr::COSAScriptCntPtr
  409. //----------------------------------------------------------------------------------------
  410.  
  411. COSAScriptCntPtr::COSAScriptCntPtr(const COSAScriptCntPtr& other) :
  412.     fRep(other.fRep)
  413. {
  414.     UpCount();
  415. }
  416.  
  417. //----------------------------------------------------------------------------------------
  418. // COSAScriptCntPtr::COSAScriptCntPtr
  419. //----------------------------------------------------------------------------------------
  420.  
  421. COSAScriptCntPtr::COSAScriptCntPtr(TOSAScriptRep* rep) :
  422.     fRep(rep)
  423. {
  424.     UpCount();
  425. }
  426.  
  427. //----------------------------------------------------------------------------------------
  428. // COSAScriptCntPtr::operator=
  429. //----------------------------------------------------------------------------------------
  430.  
  431. COSAScriptCntPtr& COSAScriptCntPtr::operator=(const COSAScriptCntPtr& other)
  432. {
  433.     SetRep(other.fRep);
  434.     return *this;
  435. }
  436.  
  437. //----------------------------------------------------------------------------------------
  438. // COSAScriptCntPtr::operator=
  439. //----------------------------------------------------------------------------------------
  440.  
  441. COSAScriptCntPtr& COSAScriptCntPtr::operator=(TOSAScriptRep* rep)
  442. {
  443.     SetRep(rep);
  444.     return *this;
  445. }
  446.  
  447. //----------------------------------------------------------------------------------------
  448. // COSAScriptCntPtr::SetRep
  449. //----------------------------------------------------------------------------------------
  450.  
  451. void COSAScriptCntPtr::SetRep(TOSAScriptRep* rep)
  452. {
  453.     if (fRep != rep)
  454.     {
  455.         DownCount();
  456.         fRep = rep;
  457.         UpCount();
  458.     }
  459. }
  460.         
  461. //----------------------------------------------------------------------------------------
  462. // COSAScriptCntPtr::UpCount
  463. //----------------------------------------------------------------------------------------
  464.  
  465. void COSAScriptCntPtr::UpCount()
  466. {
  467.     if (fRep)
  468.         fRep->IncrementReferenceCount();
  469. }
  470.  
  471. //----------------------------------------------------------------------------------------
  472. // COSAScriptCntPtr::DownCount
  473. //----------------------------------------------------------------------------------------
  474.  
  475. void COSAScriptCntPtr::DownCount()
  476. {
  477.     if (fRep && !fRep->DecrementReferenceCount())
  478.         delete fRep;
  479.     // It is not necessary to set fRep to 0. To see why, see how DownCount is used above.
  480.     // In all cases, fRep is either immediately reset, or the instance is being destroyed.
  481.     // Note too that DownCount is private, so the usages above all all possible usages.
  482. }
  483.  
  484. //----------------------------------------------------------------------------------------
  485. // COSAScriptCntPtr::NewOSAScript:
  486. //----------------------------------------------------------------------------------------
  487. #pragma segment MAOpen
  488.  
  489. TOSAScriptRep* COSAScriptCntPtr::NewOSAScript()
  490. {
  491.     MAVolatileInit(TOSAScriptRep*, script, new TOSAScriptRep);
  492.     FailInfo fi;
  493.     Try(fi)
  494.     {
  495.         script->IOSAScript();
  496.         fi.Success();
  497.     }
  498.     else // Recover
  499.     {
  500.         script = (TOSAScriptRep*) FreeIfObject(script);
  501.         fi.ReSignal();
  502.     }
  503.     return script;
  504. }
  505.  
  506. //========================================================================================
  507. // CLASS TOSAScriptRep
  508. //========================================================================================
  509. #undef Inherited
  510. #define Inherited TObject
  511.  
  512. #pragma segment MAScriptingRes
  513. MA_DEFINE_CLASS_M1(TOSAScriptRep, Inherited);
  514.  
  515. //----------------------------------------------------------------------------------------
  516. // TOSAScriptRep constructor
  517. //----------------------------------------------------------------------------------------
  518. #pragma segment ConstructorRes
  519.  
  520. TOSAScriptRep::TOSAScriptRep()
  521.     : fScript(kOSANullScript),
  522.       fNextScriptIdle(0),
  523.       fCompileFlags(kOSAModeCompileIntoContext),
  524.       fLoadFlags(kOSAModeNull),
  525.       fStoreFlags(kOSAModeDontStoreParent),
  526.       fExecuteFlags(kOSAModeNull),
  527.       fDoEventFlags(kOSAModeNull),
  528.       fRefCount(0)
  529. {
  530.   fScriptingComponent = COSAScript::GetDefaultComponent();
  531. }
  532.  
  533. //----------------------------------------------------------------------------------------
  534. // TOSAScriptRep destructor
  535. //----------------------------------------------------------------------------------------
  536. #pragma segment MADestructorRes
  537.  
  538. TOSAScriptRep::~TOSAScriptRep()
  539. {
  540.     FreeOSAScript();
  541. }
  542.  
  543. //----------------------------------------------------------------------------------------
  544. // TOSAScriptRep::IOSAScript:
  545. //----------------------------------------------------------------------------------------
  546. #pragma segment MAOpen
  547.  
  548. void TOSAScriptRep::IOSAScript()
  549. {
  550.     IObject();
  551. }
  552.  
  553. //----------------------------------------------------------------------------------------
  554. // TOSAScriptRep::HasOSAScript:
  555. //----------------------------------------------------------------------------------------
  556. #pragma segment MAScriptingRes
  557.  
  558. Boolean TOSAScriptRep::HasOSAScript()
  559. {
  560.     return HasAppleScript() && (!fScript.IsEmpty());
  561. }
  562.  
  563. //----------------------------------------------------------------------------------------
  564. // TOSAScriptRep::FreeOSAScript:
  565. //----------------------------------------------------------------------------------------
  566. #pragma segment MAOSLDispatch
  567.  
  568. void TOSAScriptRep::FreeOSAScript()
  569. {
  570.     if (this->HasOSAScript())
  571.         FailOSAError(fScript.DisposeScript(fScriptingComponent));
  572. }
  573.  
  574. //----------------------------------------------------------------------------------------
  575. // TOSAScriptRep::SetOSAScript:
  576. //----------------------------------------------------------------------------------------
  577. #pragma segment MAOSLDispatch
  578.  
  579. void TOSAScriptRep::SetOSAScript(const CAEDesc& scriptDesc)
  580. {
  581.     if (HasAppleScript())
  582.     {
  583.         this->FreeOSAScript();    // dispose the current script
  584.         FailOSAError(fScript.SetScript(fScriptingComponent, scriptDesc, fCompileFlags, fLoadFlags));
  585.         OSAID parentScript = GetOSAParent();
  586.         fScript.SetParentScript(fScriptingComponent, parentScript);
  587.     }
  588. }
  589.  
  590. //----------------------------------------------------------------------------------------
  591. // TOSAScriptRep::GetOSAScript:
  592. //----------------------------------------------------------------------------------------
  593. #pragma segment MAOSLDispatch
  594.  
  595. void TOSAScriptRep::GetOSAScript(CAEDesc& scriptDesc,
  596.                                 const CAEDesc& desiredType)
  597. {
  598.     if (HasAppleScript())
  599.     {
  600.         if (this->HasOSAScript())
  601.         {
  602.             DescType whichType = typeOSAGenericStorage;
  603.             if (desiredType.GetDescriptorType() == typeType)
  604.                 whichType = desiredType.GetType();
  605.             FailOSAError(fScript.GetScript(fScriptingComponent, whichType, scriptDesc, fStoreFlags));
  606.         }
  607.     }
  608. }
  609.  
  610. //----------------------------------------------------------------------------------------
  611. // TOSAScriptRep::ExecuteOSAScript:
  612. //----------------------------------------------------------------------------------------
  613. #pragma segment MAOSLDispatch
  614.  
  615. OSAID TOSAScriptRep::ExecuteOSAScript()
  616. {
  617.     OSAID resultScript = kOSANullScript;
  618.     if (HasOSAScript())
  619.         FailOSAError(fScript.Execute(fScriptingComponent, kOSANullScript, fExecuteFlags, resultScript));
  620.     
  621.     return resultScript;
  622. }
  623.  
  624. //----------------------------------------------------------------------------------------
  625. // TOSAScriptRep::HandleOSAEvent:
  626. //----------------------------------------------------------------------------------------
  627. #pragma segment MAScriptingRes
  628.  
  629. Boolean TOSAScriptRep::HandleOSAEvent(CommandNumber /*aCommandNumber*/,
  630.                                    TAppleEvent* message,
  631.                                    TAppleEvent* reply)
  632. {
  633.     Boolean handled = FALSE;
  634.     if (HasAppleScript())
  635.     {
  636.         OSErr err = errAEEventNotHandled;
  637.         COSAScript globalScript = COSAScript::GetGlobalScript();
  638.         COSAScript parentScript = GetOSAParent();
  639.         Boolean hasParentScript = !(parentScript == kOSANullScript);
  640.         Boolean hasLocalScript = HasOSAScript();
  641.         Boolean useGlobalScript = !(globalScript == kOSANullScript) &&
  642.                                   (hasLocalScript || hasParentScript);
  643.         
  644.         if (useGlobalScript || hasLocalScript || hasParentScript)
  645.         {
  646.             long refCon = 0;                        // passed by address
  647.             AEEventHandlerUPP currProc = NULL;        // passed by address
  648.  
  649.             FailInfo fi;
  650.             Try(fi)
  651.             {
  652.                 FailOSAError(OSAGetResumeDispatchProc(fScriptingComponent, &currProc, &refCon));
  653.                 FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, (AEEventHandlerUPP)kOSAUseStandardDispatch, kOSADontUsePhac));
  654.                 
  655.                 if (useGlobalScript)
  656.                 {
  657.                     if (hasLocalScript)
  658.                         globalScript.SetParentScript(fScriptingComponent, fScript);
  659.                     else if (hasParentScript)
  660.                         globalScript.SetParentScript(fScriptingComponent, parentScript);
  661.                     err = globalScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
  662.                 }
  663.                 else if (hasLocalScript)
  664.                 {
  665.                     err = fScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
  666.                 }
  667.                 else if (hasParentScript)
  668.                 {
  669.                     err = parentScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
  670.                 }
  671.                 handled = (err == noErr);
  672.                 FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, currProc, refCon));
  673.                 fi.Success();
  674.             }
  675.             else // Recover
  676.             {
  677.                 FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, currProc, refCon));
  678.                 fi.ReSignal();
  679.             }
  680.             
  681.         }
  682.     }
  683.     return handled;
  684. } // TOSAScriptRep::HandleOSAEvent
  685.  
  686. //----------------------------------------------------------------------------------------
  687. // TOSAScriptRep::ReadOSAScript:
  688. //----------------------------------------------------------------------------------------
  689. #pragma segment MAOSLDispatch
  690.  
  691. void TOSAScriptRep::ReadOSAScript(TStream* aStream)
  692. {
  693.     CTempDesc theScriptDesc;
  694.     theScriptDesc.ReadFrom(aStream);
  695.     SetOSAScript(theScriptDesc);
  696. } // TOSAScriptRep::ReadOSAScript
  697.  
  698. //----------------------------------------------------------------------------------------
  699. // TOSAScriptRep::ReadOSAScript:
  700. //----------------------------------------------------------------------------------------
  701. #pragma segment MAOSLDispatch
  702.  
  703. void TOSAScriptRep::ReadOSAScript(    TFile*     aFile,
  704.                                     ResType    resourceType,
  705.                                     short    resourceID)
  706. {
  707.     CTempDesc theScriptDesc;
  708.     
  709.     theScriptDesc.ReadFrom(aFile, resourceType, resourceID);
  710.     this->SetOSAScript(theScriptDesc);
  711. } // TOSAScriptRep::ReadOSAScript:
  712.  
  713. //----------------------------------------------------------------------------------------
  714. // TOSAScriptRep::WriteOSAScript:
  715. //----------------------------------------------------------------------------------------
  716. #pragma segment MAOSLDispatch
  717.  
  718. void TOSAScriptRep::WriteOSAScript(    TStream* aStream,
  719.                                     DescType asType)
  720. {
  721.     CTempDesc theScriptDesc;
  722.     CTempDesc theTypeDesc;
  723.     theTypeDesc.PutType(asType);
  724.     GetOSAScript(theScriptDesc, theTypeDesc);
  725.     theScriptDesc.WriteTo(aStream);
  726. } // TOSAScriptRep::WriteOSAScript
  727.  
  728. //----------------------------------------------------------------------------------------
  729. // TOSAScriptRep::WriteOSAScript:
  730. //----------------------------------------------------------------------------------------
  731. #pragma segment MAOSLDispatch
  732.  
  733. void TOSAScriptRep::WriteOSAScript(    TFile*         aFile,
  734.                                     DescType     asType,
  735.                                     short        resourceID,
  736.                                     CStr255&    resourceName)
  737. {
  738.     CTempDesc scriptDesc;
  739.     CTempDesc typeDesc;
  740.     
  741.     typeDesc.PutType(asType);
  742.     this->GetOSAScript(scriptDesc, typeDesc);
  743.     scriptDesc.WriteTo(aFile, resourceID, resourceName);
  744. } // TOSAScriptRep::WriteOSAScript
  745.  
  746. //----------------------------------------------------------------------------------------
  747. // TOSAScriptRep::GetOSAParent:
  748. //----------------------------------------------------------------------------------------
  749. #pragma segment MAScriptingRes
  750.  
  751. OSAID TOSAScriptRep::GetOSAParent()
  752. {
  753.     return COSAScript::GetSharedScript();
  754. } // TOSAScriptRep::GetOSAParent
  755.  
  756. //----------------------------------------------------------------------------------------
  757. // TOSAScriptRep::IdleOSAScript:
  758. //----------------------------------------------------------------------------------------
  759. #pragma segment MAScriptingRes
  760.  
  761. void TOSAScriptRep::IdleOSAScript()
  762. {
  763.     // Gives an attached script idle time so its idle event handler can do some work.
  764.     if (HasAppleScript() && (fNextScriptIdle != kMaxIdleTime) && (TickCount() > fNextScriptIdle))
  765.     {
  766.         CAEDesc myAddress;
  767.         MAVolatileInit(TAppleEvent*, message, NULL);
  768.         MAVolatileInit(TAppleEvent*, reply, NULL);
  769.         MAVolatileInit(TClientCommand*, theCmd, NULL);
  770.  
  771.         FailInfo idleFail;
  772.         Try(idleFail)
  773.         {
  774.             message = new TAppleEvent;
  775.             message->IAppleEvent('misc', 'idle', (AEAddressDesc &)myAddress, kAEWaitReply);
  776.             
  777.             reply = new TAppleEvent;
  778.             reply->IAppleEvent('misc', 'idle', (AEAddressDesc &)myAddress, kAENoReply);
  779.             
  780.             fNextScriptIdle = TickCount() + 3600; // Default to one minute in case the idle proc doesn't return anything
  781.             FailInfo fi;
  782.             Try(fi)
  783.             {
  784.                 if (HandleOSAEvent(0, message, reply) && reply->HasParameter(keyAEResult))
  785.                 {
  786.                     unsigned long idleSeconds = reply->ReadLong(keyAEResult);
  787.                     fNextScriptIdle = TickCount() + (idleSeconds * 60);
  788.                 }
  789.                 fi.Success();
  790.             }
  791.             else // Recover
  792.             {
  793.                 // fall through without resignalling
  794.             }
  795.             
  796.             theCmd = new TClientCommand;
  797.             theCmd->IClientCommand(0, NULL, FALSE, FALSE, NULL, message);
  798.             theCmd->ProcessReply(reply);
  799.             
  800.             idleFail.Success();
  801.         }
  802.         else // Recover
  803.         {
  804.             // fall through without resignalling
  805.         }
  806.         
  807.         if (theCmd)
  808.             FreeIfObject(theCmd);
  809.         else
  810.         {    // Freeing the command will free the message and reply
  811.             FreeIfObject(message);
  812.             FreeIfObject(reply);
  813.         }
  814.     }
  815. } // TOSAScriptRep::IdleOSAScript
  816.  
  817. //========================================================================================
  818. // CLASS TExecuteScriptCommand
  819. //========================================================================================
  820. #undef Inherited
  821. #define Inherited TCommand
  822.  
  823. #pragma segment MACommandNonRes
  824. MA_DEFINE_CLASS_M1(TExecuteScriptCommand, Inherited);
  825.  
  826. //----------------------------------------------------------------------------------------
  827. // TExecuteScriptCommand constructor
  828. //----------------------------------------------------------------------------------------
  829. #pragma segment MACommandRes
  830.  
  831. TExecuteScriptCommand::TExecuteScriptCommand()
  832. {
  833.     fDisposeScript = FALSE;
  834.     fComponent = NULL;
  835.     fExecuteFlags = kOSAModeNull;
  836. } // TExecuteScriptCommand::TExecuteScriptCommand
  837.  
  838. //----------------------------------------------------------------------------------------
  839. // TExecuteScriptCommand::IExecuteScriptCommand:
  840. //----------------------------------------------------------------------------------------
  841. #pragma segment MACommandRes
  842.  
  843. void TExecuteScriptCommand::IExecuteScriptCommand(CommandNumber itsCommandNumber,
  844.                                                   TCommandHandler* itsContext,
  845.                                                   Boolean canUndo,
  846.                                                   Boolean causesChange,
  847.                                                   TObject* objectToNotify,
  848.                                                   OSAID scriptToExecute,
  849.                                                   OSAID theScriptContext,
  850.                                                   long executeFlags,
  851.                                                   Boolean disposeOfScript,
  852.                                                   ComponentInstance whichComponent)
  853. {
  854.     this->ICommand(itsCommandNumber, itsContext, canUndo, causesChange, objectToNotify);
  855.     fScript = scriptToExecute;
  856.     fDisposeScript = disposeOfScript;
  857.     fComponent = whichComponent;
  858.     fScriptContext = theScriptContext;
  859.     fExecuteFlags = executeFlags;
  860. } // TExecuteScriptCommand::IExecuteScriptCommand
  861.  
  862. //----------------------------------------------------------------------------------------
  863. // TExecuteScriptCommand::DoIt:
  864. //----------------------------------------------------------------------------------------
  865. #pragma segment MADoCommand
  866.  
  867. void TExecuteScriptCommand::DoIt()    // override
  868. {
  869.     COSAScript theScript(fScript);
  870.     OSAID aResult;
  871.     if (theScript != kOSANullScript)
  872.     {
  873.         // Run it through the globals script if there is one
  874.         COSAScript globalsScript = COSAScript::GetGlobalScript();
  875.         if (globalsScript != kOSANullScript)
  876.         {
  877.             globalsScript.SetParentScript(fComponent, theScript);        
  878.             globalsScript.Execute(fComponent, fScriptContext, fExecuteFlags, aResult);
  879.         }
  880.         else
  881.             theScript.Execute(fComponent, fScriptContext, fExecuteFlags, aResult);
  882.     }
  883. } // TExecuteScriptCommand::DoIt
  884.  
  885. //----------------------------------------------------------------------------------------
  886. // TExecuteScriptCommand::Free:
  887. //----------------------------------------------------------------------------------------
  888. #pragma segment MADoCommand
  889.  
  890. TExecuteScriptCommand::~TExecuteScriptCommand()
  891. {
  892.     if (fDisposeScript)
  893.         fScript.DisposeScript(fComponent);
  894. } // TExecuteScriptCommand::Free
  895.  
  896. //----------------------------------------------------------------------------------------
  897. // End of UOSAScript.cp
  898.  
  899. #pragma segment Inline
  900.